/*
    日期时间处理
*/

var dateUtils = (function () {

    var __class = function () { this.__self = this; };
    __class.prototype.getSelf = function (str) {
        return this.__self;
    }

    /*
        *  获取13位当前时间戳
        *  @param  无
        *  @retrun number  13位当前时间戳
        */
    __class.prototype.getTimeStamp = function () {
        var time1;
        var date = new Date();
        // 有三种方式获取
        if (date.getTime) {
            time1 = date.getTime();
        } else if (date.valueOf) {
            time1 = date.valueOf();
        } else if (Date.parse) {
            time1 = Date.parse(date)
        }
        return time1;
    }

    /*
    *  将时间戳转换为时间字符串
    *  @param  time number 13位时间戳
    *  @param  flag boolean 可选参数，如果为true则返回json形式：
    *  @retrun string 2018-12-03 12:38:45  时间字符串
    */
    __class.prototype.getDateString = function (time, flag) {
        var date = new Date(time);
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var day = date.getDate();
        var hours = date.getHours();
        var mixins = date.getMinutes();
        var second = date.getSeconds();
        month = month < 10 ? "0" + month : month;
        day = day < 10 ? "0" + day : day;
        mixins = mixins < 10 ? "0" + mixins : mixins;
        second = second < 10 ? "0" + second : second;
        //星期几数组
        var weekArr = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'];
        //如果为0则获取weekArr最后一个元素
        var index = time.getDay() == 0 ? weekArr.length - 1 : time.getDay() - 1;
        //获取星期几
        var week = weekArr[index];
        if (flag) {
            return { y: year, m: month, d: day, h: hours, M: mixins, s: second, week };
        } else {
            return year + "-" + month + "-" + day + " " + hours + ":" + mixins + ":" + second + week;
        }
    };

    /*
    *  将指定时间格式化为时间字符串
    *  @param  fmt String 格式化的格式，完整形式：YYYY-mm-dd HH:MM:SS
    *  @param  date Date 日期时间，如果为时间戳，则flag必须为true
    *  @param  flag boolean 可选参数，如果日期时间为时间戳则flag必须为true
    *  @retrun string 2018-12-03 12:38:45  时间字符串
    */
    __class.prototype.getDateFormat = function(fmt, date, flag) {
        if(flag){date=new Date(date);}
        var ret;
        var opt = {
            "Y+": date.getFullYear().toString(),        // 年
            "m+": (date.getMonth() + 1).toString(),     // 月
            "d+": date.getDate().toString(),            // 日
            "H+": date.getHours().toString(),           // 时
            "M+": date.getMinutes().toString(),         // 分
            "S+": date.getSeconds().toString()          // 秒
            // 有其他格式化字符需求可以继续添加，必须转化成字符串
        };
        for (var k in opt) {
            ret = new RegExp("(" + k + ")").exec(fmt);
            if (ret) {
                fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
            };
        };
        return fmt;
    }

    /*
    *  时钟效果
    *  @param e DOM Element DOM对象，用于定式写入时间
    *  @retrun string 2018年12月03日 星期日 12:38:45  时间字符串
    */
    __class.prototype.getClock = function(e) {
 
        //获取当前时间
        var n = new Date();
     
        //获取年
        var getFY = n.getFullYear();
        //获取月，从0开始计算
        var getMo1 = n.getMonth() + 1;
        //获取日，从1开始计算
        var getD1 = n.getDate();
     
        //星期几数组
        var weekArr = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'];
        //如果为0则获取weekArr最后一个元素
        var index = n.getDay() == 0 ? weekArr.length - 1 : n.getDay() - 1;
        //获取星期几
        var week = weekArr[index];
     
        //获取时，基于当地时间
        var getH1 = n.getHours();
     
        //获取分，基于当地时间
        var getMe1 = n.getMinutes() < 10 ? '0' + n.getMinutes() : n.getMinutes();
     
        //获取秒，基于当地时间
        var getS1 = n.getSeconds() < 10 ? '0' + n.getSeconds() : n.getSeconds();
     
        //格式化后的输出
        var str = getFY + "年" + getMo1 + "月" + getD1 + "日 " + week + " " + getH1 + ":" + getMe1 + ":" + getS1;
     
        e.innerHTML = str;
     
        //递归调用
        var that = this;
        setTimeout(function () {
            that.__self.getClock(e, n);
        }, 1000);
    }

    /*
    *  带天数倒计时效果
    *  @param startTime String 开始时间，比如：2018年12月03日
    *  @param endTime String 结束时间，比如：2018年12月05日
    *  @param fn function 回调函数，形参分别是：day 天, hour 小时, minute 分钟, second 秒
    *  @retrun 无
    */
    __class.prototype.countDown = function(startTime, endTime, fn) {

        if(!startTime){
            startTime = new Date();
        }else{
            startTime = new Date(startTime);
        }
        
        //开始时间
        var dateStart = (startTime.getTime() + 1) / 1000;   //时间戳毫秒转秒
        //结束时间
        var dateEnd = new Date(endTime).getTime() / 1000;   //时间戳毫秒转秒
        
        //计算时间差
        var times = dateEnd - dateStart;

        var timer = null;
        timer = setInterval(function () {
            var day = 0,
                hour = 0,
                minute = 0,
                second = 0;//时间默认值
            if (times > 0) {
                day = Math.floor(times / (60 * 60 * 24));
                hour = Math.floor(times / (60 * 60)) - (day * 24);
                minute = Math.floor(times / 60) - (day * 24 * 60) - (hour * 60);
                second = Math.floor(times) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);
            }
            if (day <= 9) day = '0' + day;
            if (hour <= 9) hour = '0' + hour;
            if (minute <= 9) minute = '0' + minute;
            if (second <= 9) second = '0' + second;
            //console.log(day + "天:" + hour + "小时：" + minute + "分钟：" + second + "秒");
            
            //执行回调函数，目的是可以自定义dom结构
            fn(day, hour, minute, second);
            
            times--;
        }, 1000);
        if (times <= 0) {
            clearInterval(timer);
        }
    }

    return new __class();
})();